home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et-2_2.lha / et2.2 / src / NumItem.C < prev    next >
C/C++ Source or Header  |  1990-12-03  |  2KB  |  119 lines

  1. //$NumItem$
  2.  
  3. #include "NumItem.h"
  4. #include "CheapText.h"
  5. #include "RestrTView.h"
  6. #include "RegularExp.h"
  7. #include "Alert_e.h"
  8.  
  9. static RegularExp *rexInt;
  10.  
  11. //---- NumItem -----------------------------------------------------------------
  12.  
  13. MetaImpl(NumItem, (T(minVal), T(maxVal), T(inc), 0));
  14.  
  15. NumItem::NumItem(int id, int val, int min, int max, int ndig, int increment) : 
  16.     EditTextItem(id,
  17.         new RestrTextView((View*)0,
  18.         rexInt ? rexInt : rexInt= new RegularExp("\\(+\\|-\\)?[0-9]*"),
  19.             gFitRect, new CheapText), gSysFont->Width('0')*ndig)
  20. {
  21.     minVal= min;
  22.     maxVal= max;
  23.     inc= increment;
  24.     SetValue(val, FALSE);
  25. }
  26.  
  27. void NumItem::Incr()
  28. {
  29.     int newVal, oldVal= GetValue();
  30.  
  31.     if (oldVal+inc > maxVal)
  32.     newVal= minVal;
  33.     else
  34.     newVal= oldVal+inc;
  35.     SetValue(newVal);
  36. }
  37.  
  38. void NumItem::Decr()
  39. {
  40.     int newVal, oldVal= GetValue();
  41.  
  42.     if (oldVal-inc < minVal)
  43.     newVal= maxVal;
  44.     else
  45.     newVal= oldVal-inc;
  46.     SetValue(newVal);
  47. }
  48.  
  49. void NumItem::SendDown(int id, int part, void *val)
  50. {
  51.     switch (part) {
  52.     case cPartIncr:
  53.     Incr();
  54.     break;
  55.     case cPartDecr:
  56.     Decr();
  57.     break;
  58.     default:
  59.     EditTextItem::SendDown(id, part, val);
  60.     return;
  61.     }
  62. }
  63.  
  64. int NumItem::GetValue()
  65. {
  66.     return GetText()->AsInt();
  67. }
  68.  
  69. void NumItem::SetValue(int newVal, bool redraw)
  70. {
  71.     newVal= range(minVal, maxVal, newVal);
  72.     if (newVal != GetValue() || GetTextSize() == 0) {
  73.     SetString((byte*) form("%d", newVal));
  74.     if (redraw)
  75.         ForceRedraw();
  76.     }
  77. }
  78.  
  79. void NumItem::GetRange(int &min, int &max)
  80. {
  81.     min= minVal;
  82.     max= maxVal;
  83. }
  84.  
  85. void NumItem::SetRange(int min, int max)
  86. {
  87.     minVal= min;
  88.     maxVal= max;
  89.     SetValue(GetValue());
  90. }
  91.  
  92. bool NumItem::Validate()
  93. {
  94.     int oldVal= GetValue();
  95.     
  96.     if (oldVal < minVal || oldVal > maxVal) {
  97.     ShowAlert(eAlertNote, "%d not in range %d-%d", oldVal, minVal, maxVal);
  98.     SetValue(oldVal);
  99.     return FALSE;
  100.     }
  101.     return TRUE;
  102. }
  103.  
  104. ostream& NumItem::PrintOn(ostream &s)
  105. {
  106.     EditTextItem::PrintOn(s);
  107.     return s << minVal SP << maxVal SP << GetValue() SP << inc SP;
  108. }
  109.  
  110. istream& NumItem::ReadFrom(istream &s)
  111. {
  112.     int i;
  113.     EditTextItem::ReadFrom(s);
  114.     s >> minVal >> maxVal >> i >> inc;
  115.     SetValue(i, FALSE);
  116.     return s;
  117. }
  118.  
  119.